%!TEX root = ../tesi.tex

\chapter{Introduzione}
\label{ch:introduzione}
La presente tesi si colloca nell'ambito dello sviluppo dello \ac{SF} 2.0, un framework concepito per la realizzazione di applicazioni che fanno uso di grafica tridimensionale real-time ideato e sviluppato dall'Ingegner Alessandro Martinelli.

La grafica tridimensionale, o computer grafica 3D, consiste nell'utilizzo di modelli geometrici tridimensionali da parte di un computer per il calcolo e il rendering\footnote{Con rendering, in computer grafica, si intende il processo che attraverso l'elaborazione di un modello determina il colore di ogni pixel contenuto in una immagine digitale\cite{wiki:rendering-it,wiki:rendering-en}.} di immagini digitali.

Essa \`e attualmente diffusa in molteplici campi, cosa che la rende un'esperienza comune nella vita di tutti giorni. Non solo infatti viene utilizzata in modo intensivo nella pubblicit\`a e nell'intrattenimento ma anche in settori come quello medico e nella ricerca scientifica.

La grafica tridimensionale real-time \`e un ramo specifico della grafica tridimensionale che si focalizza sulla generazione di simulazioni di ambienti e/o oggetti con la quale un utente pu\`o interagire osservando una reazione coerente nella simulazione. Questa percezione di interazione viene fornita da una generazione sequenziale di immagini che come nelle pellicole cinematografiche danno un'illusione di movimento, ma in cui l'effettivo contenuto dei fotogrammi non \`e predeterminato ed \`e calcolato al momento sulla base degli input forniti.

In base a quanto esplicato in \cite{book:realtimerendering}, per poter avere un'interazione soddisfacente \`e molto importante che la velocit\`a con cui vengono visualizzate le immagini, misurata in \ac{fps}, si mantenga stabile ed il pi\`u possibile elevata in modo da minimizzare i tempi di risposta ed impedire che questi interferiscano con l'interazione stessa.
Ci\`o pone il problema di ottenere un alto valore di \ac{fps} che a sua volta implica dei vincoli temporali sulla possibile elaborazione dei modelli tridimensionali: se per esempio si volesse mantenere una velocit\`a di visualizzazione pari a 60 \ac{fps}, il tempo di calcolo a disposizione per l'elaborazione di un frame rispetto al precedente ammonterebbe a circa 15 millisecondi.
Questa caratteristica differenzia profondamente la grafica real-time da quella non-real-time in cui, non avendo vincoli temporali stretti per la generazione dei frame, il focus \`e spostato sull'applicazione di modelli di elaborazione complessi e computazionalmente onerosi che siano in grado di generare immagini il pi\`u fotorealistiche possibile. 

Le problematiche della grafica real-time hanno imposto nel corso degli anni lo sviluppo di tecniche e tecnologie specifiche di settore il cui stato dell'arte \`e oggi rappresentato dall'ultima generazione di \ac{API} di programmazione grafica, dalle \ac{GPU}\footnote{Una \ac{GPU} \`e un microprocessore dedicato alla generazione delle immagini visualizzate sullo schermo di un dispositivo, alleggerendo da questo carico il processore principale.} a pipeline programmabile e dai Linguaggi di Shading.

Queste tecnologie hanno assunto una grande importanza perch\'e consentono di raggiungere elevatissimi livelli di qualit\`a e prestazioni quando sono utilizzate per la generazione di grafica 3D real-time e la ricerca su di esse ha portato allo sviluppo del \ac{GPGPU} ovvero la possibilit\`a di utilizzare la capacit\`a di calcolo delle \ac{GPU} per processare anche dati differenti da quelli grafici.

Le \ac{GPU} a pipeline programmabile, in contrapposizione a quelle con pipeline fissa, permettono di adattare gli stadi della pipeline di renderizzazione mediante l'utilizzo dei linguaggi di Shading. In sostanza l'hardware viene programmato per il calcolo di algoritmi specifici da applicare ai dati grafici. Ci\`o consente di adattare il processo di renderizzazione agli effetti che si desidera ottenere e di sfruttare l'hardware della \ac{GPU} per velocizzarne la computazione. 
Questo paradigma si \`e rivelato molto efficace ed efficiente, tanto da venire oggi applicato nella quasi totalit\`a delle \ac{GPU} moderne, sia che si tratti di dispositivi di fascia alta che di processori grafici dedicati ad architetture mobile come i cellulari.

Parallelamente le \ac{API} di programmazione grafica moderne si sono sviluppate consentendo lo sfruttamento sempre pi\`u efficiente delle risorse hardware delle \ac{GPU}, ma non solo: la loro integrazione su piattaforme software pensate per il mercato embedded ha consentito una proliferazione di applicazioni che fanno uso di grafica tridimensionale sia su cellulari che tablet.
Non \`e difficile trovare per questi dispositivi, dotati ormai quasi obbligatoriamente di fotocamera, applicazioni di realt\`a aumentata che sfruttino le \ac{API} per inserire elementi grafici tridimensionali nelle immagini catturate dal sensore ottico.
Un evento che nei prossimi anni porter\`a un impatto significativo sul mercato, consiste nel fatto che molti sviluppatori di browser per la navigazione di internet stanno attualmente lavorando per integrare l'\ac{API} grafica WebGL all'interno dei loro software tramite JavaScript. Questo consentir\`a l'esecuzione di applicazioni 3D direttamente all'interno dei browser stessi, eliminando la transizione tra contenuti 3D e contenuti non-3D e consentendo una integrazione diretta con servizi internet di terze parti.

Di pari passo, i produttori di middleware, engine e framework\footnote{Nel contesto delle applicazioni per la grafica tridimensionale con middleware di solito si intendono componenti software dedicate a compiti specifici, come la gestione della fisica o il pathfinding, che vengono affiancate agli engine ed ai framework. Per una descrizione pi\`u completa di engine e framework e le differenze fra loro, fare riferimento alla sezione \ref{sec:panoramicastrumenti}}, hanno integrato nelle funzionalit\`a dei loro prodotti la capacit\`a di sfruttare le pipeline programmabili e tool per testare e comporre nuovi shader\footnote{Uno shader \`e un programma scritto con un linguaggio di shading, che viene caricato ed eseguito in hardware da una \ac{GPU}.}. Una sempre maggiore quantit\`a di queste case produttrici supportano le piattaforme mobile (come Android e iOS) e rilasciano plugin o applicazioni ``WebPlayer'' per distribuire contenuti attraverso i browser web. 
In alcuni casi, come quello citato in \cite{site:mozillaunrealannounce}, produttori di browser e case di sviluppo collaborano per migliorare le prestazioni di WebGL e convertire in JavaScript gli engine e i framework cos{\`\i} da poterli eseguire direttamente all'interno delle pagine web.

In questo contesto si inserisce lo Shadow Framework, il quale \`e stato progettato non solo per utilizzare e supportare tutte le tecnologie che costituiscono lo stato dell'arte nel campo della grafica 3D real-time, ma anche con l'obbiettivo di farlo sperimentando un nuovo approccio nella generazione e nella gestione dei dati grafici tridimensionali. 
La chiave di questo approccio consiste nell'abbandonare la vecchia concezione per cui gli oggetti tridimensionali sono scolpiti generando mesh di vertici che compongono triangoli, ma utilizzando primitive parametriche pi\`u complesse per poi sfruttare le capacit\`a delle pipeline programmabili e far generare dall'hardware stesso le mesh di punti necessarie per il processo di renderizzazione.
Questo tipo di procedimento permette di adattare la qualit\`a  del risultato visivo finale in base alle prestazioni dell'hardware a disposizione, eliminando la necessit\`a di produrre diverse versioni dello stesso modello la cui unica differenza consiste nel numero di vertici. \`E infatti sufficiente programmare la pipeline per produrre un minor numero di vertici per alleggerire il calcolo, mantenendo inalterato il modello parametrico di partenza.

Oltre ai vantaggi descritti, l'utilizzo di primitive parametriche permette di produrre file di dimensione molto contenuta rispetto ai sistemi classici in cui i file contengono l'elenco dei vertici che descrivono l'oggetto. Lo stesso paradigma viene usato all'interno del framework non solo per i modelli 3D, ma anche per la generazione delle texture da applicarvi, garantendo un meccanismo per scalarne la qualit\`a in base alle esigenze.

Le caratteristiche principali del framework, la cui spiegazione pi\`u dettagliata verr\`a esposta nel capitolo  \ref{ch:shadowframework}, sono le seguenti:
\begin{itemize}
	\item  la possibilit\`a di definire nuove primitive grafiche con un linguaggio specifico del framework;
	\item  la grande portabilit\`a: la versione di riferimento \`e sviluppata in linguaggio Java, ma \`e in corso di realizzazione un porting in C++ (iOS);
	\item  il design web-oriented: i meccanismi interni sono stati progettati per supportare l'utilizzo di dati in remoto ed \`e in corso di realizzazione una versione del framework in JavaScript;
\end{itemize}

%
% TODO: DA RIVEDERE, deve essere chiaro che l'applicativo voluto deve essere orientato al web
%
\section{Obbiettivo del progetto}
\label{sec:obbiettivo}
L'obbiettivo del progetto di tesi nasce dall'idea di produrre un'applicazione dimostrativa delle funzionalit\`a di rete offerte dallo Shadow Framework.
Ci\`o che si voleva ottenere era una coppia client-server in cui il server fosse in grado di gestire connessioni simultanee da parte di un numero indefinito di client. 
Ogni client, ottenuta una connessione con il server, doveva poter visualizzare una scena iniziale navigabile, richiedendo solamente i dati relativi all'ambiente in prossimit\`a della posizione, all'interno della scena, dell'utente.

Successivamente si volevano analizzare due possibili approcci: il primo in cui il client richiede al server i dati aggiuntivi riguardo la scena a seconda delle necessit\`a, ad esempio una volta raggiunti i bordi dell'ambiente. Nel secondo il server tiene traccia degli spostamenti nella navigazione comunicando attivamente con il client, componendo in modo dinamico dei pacchetti di dati che prevedano le future richieste del client.

Le astrazioni del layer dati del framework sono state progettate specificatamente per consentire lo sfruttamento della comunicazione di rete, ma fino a quel momento non era stata fatta alcuna specifica implementazione che la utilizzasse. Si desiderava perci\`o produrre questo tipo di applicazione non solo a scopo dimostrativo, ma anche per individuare e correggere probabili bug presenti nel codice e dovuti a vincoli di sincronizzazione non evidenziati dai test effettuati con dati memorizzati su macchina locale.

L'obbiettivo della tesi \`e cos{\`\i} diventato quello di produrre dei moduli di libreria che fossero utili allo sviluppo di applicazioni client-server.

La progettazione di questi moduli si \`e focalizzata su alcuni punti cardine che rappresentano la chiave dello sviluppo del progetto. La struttura del framework \`e stata ideata con l'obbiettivo di garantirne l'estendibilit\`a, perci\`o \`e stato di fondamentale importanza sfruttare i meccanismi e le astrazioni previste in tal senso e lo sviluppo dei moduli \`e stato guidato dagli stessi principi.

\section{Organizzazione del documento}
\label{sec:orgtesi}
Il presente documento \`e organizzato secondo la seguente suddivisione in capitoli:
\begin{itemize}
	\item  \textbf{Capitolo \ref{ch:shadowframework}:} in cui viene presentata una panoramica generale sullo Shadow Framework 2.0 in rapporto al panorama generale sui framework di programmazione di grafica tridimensionale real-time.
	\item  \textbf{Capitolo \ref{ch:gestionedati}:} in cui \`e descritta l'astrazione di gestione dei dati interna al framework e come essa viene utilizzata dalle applicazioni \ac{SF}.
	\item  \textbf{Capitolo \ref{ch:sfremoteconnection}:} in cui viene descritto il progetto Sf-Remote-Connection, i moduli che lo compongono, le funzionalit\`a offerte e i package java prodotti.
	\item  \textbf{Capitolo \ref{ch:testerisultati}:} in cui sono presentate le applicazioni di test ed i risultati prodotti.
	\item  \textbf{Capitolo \ref{ch:conclusioni}:} in cui viene presentato un riassunto del lavoro svolto, i risultati e vengono proposti alcuni sviluppi futuri.
\end{itemize}


